package com.cskaoyan.javase.object._2tostring;


/**
 * toString方法，方法的声明：
 * public String toString() {
 *         return getClass().getName() + "@" + Integer.toHexString(hashCode());
 * }
 * getClass().getName()表示打印全限定类名
 * hashCode()是通过一个本地方法，计算对象的地址值，返回一个int整数（这个int整数可以看成地址值的十进制整数表示）
 * Integer.toHexString(hashCode() 整体表示十六进制地址值的字符串
 *
 * 以上，该方法 打印全限定类名 + @ + 十六进制地址值
 *
 * 方法的作用：
 * 1. 返回该对象（调用toString方法的对象）的字符串表示。
 * 2. 通常，`toString`方法会返回一个“以文本方式表示”此对象的字符串。
 * 3. 结果应是一个简明但易于读懂的信息表达式。
 * 4. 建议所有子类都重写此方法。
 *
 * 所以toString方法的作用是：直接打印对象名会自动调用该方法，获取用对象名做字符串的拼接也会自动调用该方法
 * 我们并不关心全限定类名和地址值，一个对象的字符串描述，我们更希望能看到对象的状态（成员变量的取值）。要想实现这种需求，就需要自己重写`toString`方法。重写没有固定的标准格式，一般拼字符串连接成员变量的取值，就可以了。
 *
 * 普遍情况下，如无特别需求，直接alt + insert自动重写即可。
 *
 * 注意事项：
 *      1.这个方法就是为了打印成员变量取值的，所以你不要在里面乱写东西。
 *      2.打印变量名或者拼接字符串时，会自动去调用toString，但总有人喜欢画蛇添足，加上toString
 *          这种行为是不好的
 *      3.如果成员变量列表中，还有引用数据类型。那么就需要再去重写它们的toString方法（String不用）
 *
 * @since 09:26
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        /*Student s = new Student(1, 19, 100);
        // s = null;
        System.out.println(s.toString());
        System.out.println(s.toString() + " hello world!");
        // System.out.println(s.age);*/

        Student s = new Student(1, 18, 100, "张三", new Star(20));
        System.out.println(s);
    }
}

class Student {
    int id;
    int age;
    double score;
    String name;
    Star s;

    /*@Override
    public String toString() {
        return "Student {" + "id = " + id +
                ", age = " + age +
                ", score = " + score +
                "}";
    }*/

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", age=" + age +
                ", score=" + score +
                ", name='" + name + '\'' +
                ", s=" + s +
                '}';
    }

    public Student(int id, int age, double score) {
        this.id = id;
        this.age = age;
        this.score = score;
    }

    public Student(int id, int age, double score, String name, Star s) {
        this.id = id;
        this.age = age;
        this.score = score;
        this.name = name;
        this.s = s;
    }

    public Student() {
    }
}
class Star{
    int age;

    public Star() {
    }

    public Star(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Star{" +
                "age=" + age +
                '}';
    }
}